package com.bianguo.android.injectlibrary.listener;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;

public class ListenerInvocationHandler implements InvocationHandler {

    private Object target;
    private HashMap<String, Method> methodMap;
    private final static long QUICK_EVENT_TIME_SPAN = 1000; // 阻塞事件
    private long lastClickTime;


    public ListenerInvocationHandler(Object target) {
        this.target = target;
        this.methodMap = new HashMap<>();
    }

    /**
     * 被代理的对象每次调用一个方法都会走这里
     * @param o 指代我们所代理的那个真实对象
     * @param method 被调用的方法
     * @param args 被调用方法的参数
     * @return 被调用方法的返回值，如果是void的话就是null，如果不是void的话就是return method.invoke(Object, args);
     * @throws Throwable
     */
    @Override
    public Object invoke(Object o, Method method, Object[] args) throws Throwable {
        if (target != null) {
            //点击阻塞，防止用户一直连续点击
            long time = System.currentTimeMillis() - lastClickTime;
            if (time < QUICK_EVENT_TIME_SPAN) {
                return null;
            }
            lastClickTime = System.currentTimeMillis();
            String methodName = method.getName();
            method = methodMap.get(methodName);
            if (method != null) {
                method.invoke(target, args);
            }
        }
        return null;
    }

    /**
     * 拦截的添加
     * @param methodName 本应该执行的方法，onClick（）， 拦截
     * @param method 执行自定义(注解)的方法，onClick
     */
    public void addMethod(String methodName, Method method) {
        methodMap.put(methodName, method);
    }
}
